package com.hmall.common.proxy;

import com.hmall.common.utils.UserContext;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;

/**
 * @author xiaopeng
 * @version 1.0
 */
public class MessageConverterProxy implements MessageConverter {
    private final Jackson2JsonMessageConverter targetConverter;

    // 构造函数，传入目标转换器
    public MessageConverterProxy(Jackson2JsonMessageConverter targetConverter) {
        this.targetConverter = targetConverter;
    }

    /**
     * 将对象转换为消息
     * 在转换过程中，会尝试从上下文中获取 userId，并将其注入到消息头中
     *
     * @param object            要转换的对象
     * @param messageProperties 消息属性
     * @return 转换后的消息
     */
    @Override
    public Message toMessage(Object object, MessageProperties messageProperties) {
        // 增强逻辑：在消息头中注入 userId
        Long userId = UserContext.getUser(); // 从上下文获取 userId
        if (userId != null) {
            messageProperties.setHeader("userId", userId);
        }

        // 调用目标方法
        return targetConverter.toMessage(object, messageProperties);
    }

    /**
     * 从消息中转换出对象
     * 在转换过程中，会尝试从消息头中提取 userId，并将其注入到 UserContext 中
     *
     * @param message 消息对象
     * @return 转换后的对象
     */
    @Override
    public Object fromMessage(Message message) {
        // 增强逻辑：从消息头中提取 userId 并注入到 UserContext
        Long userId = (Long) message.getMessageProperties().getHeaders().get("userId");
        if (userId != null) {
            UserContext.setUser(userId);
        }

        // 调用目标方法
        return targetConverter.fromMessage(message);
    }
}

